#!/bin/bash

# 自动化备份脚本
# 备份MySQL数据库与网站目录，本地保留7天，同时进行远程备份

# 配置参数
# MySQL配置
DB_USER="backup_user"       # MySQL备份用户
DB_PASS="your_password"     # MySQL密码
DB_HOST="localhost"         # MySQL主机
DB_DATABASES="all"          # 要备份的数据库，"all"表示所有数据库

# 网站目录配置
WEB_DIRS="/var/www/html /var/www/blog"  # 要备份的网站目录，空格分隔

# 备份配置
BACKUP_DIR="/backup/local"   # 本地备份目录
RETENTION_DAYS=7             # 本地备份保留天数
DATE=$(date +%Y%m%d_%H%M%S)  # 当前日期时间

# 远程备份配置
REMOTE_ENABLE=true           # 是否启用远程备份
REMOTE_USER="backup_user"    # 远程服务器用户
REMOTE_HOST="remote.example.com"  # 远程服务器地址
REMOTE_DIR="/backup/remote"  # 远程服务器备份目录
# 可以使用scp或rsync，选择一个即可
# TRANSFER_METHOD="scp"
TRANSFER_METHOD="rsync"

# 创建本地备份目录
mkdir -p "$BACKUP_DIR"

# 备份MySQL数据库
backup_mysql() {
    echo "开始MySQL数据库备份..."
    
    # 创建数据库备份子目录
    mkdir -p "$BACKUP_DIR/mysql"
    
    if [ "$DB_DATABASES" = "all" ]; then
        # 备份所有数据库
        mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" --all-databases | gzip > "$BACKUP_DIR/mysql/all_databases_$DATE.sql.gz"
    else
        # 备份指定数据库
        for db in $DB_DATABASES; do
            mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$db" | gzip > "$BACKUP_DIR/mysql/${db}_$DATE.sql.gz"
        done
    fi
    
    echo "MySQL数据库备份完成"
}

# 备份网站目录
backup_web() {
    echo "开始网站目录备份..."
    
    # 创建网站备份子目录
    mkdir -p "$BACKUP_DIR/web"
    
    for dir in $WEB_DIRS; do
        # 获取目录名作为备份文件名
        dir_name=$(basename "$dir")
        tar -czf "$BACKUP_DIR/web/${dir_name}_$DATE.tar.gz" "$dir"
    done
    
    echo "网站目录备份完成"
}

# 清理过期备份
cleanup_old_backups() {
    echo "清理过期备份..."
    find "$BACKUP_DIR" -type f -mtime +"$RETENTION_DAYS" -delete
    echo "过期备份清理完成"
}

# 远程备份
remote_backup() {
    if [ "$REMOTE_ENABLE" = true ]; then
        echo "开始远程备份..."
        
        case $TRANSFER_METHOD in
            scp)
                # 使用scp传输备份
                scp -r "$BACKUP_DIR/mysql/*$DATE*" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/mysql/"
                scp -r "$BACKUP_DIR/web/*$DATE*" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/web/"
                ;;
            rsync)
                # 使用rsync传输备份，增量传输更高效
                rsync -avz "$BACKUP_DIR/mysql/*$DATE*" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/mysql/"
                rsync -avz "$BACKUP_DIR/web/*$DATE*" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/web/"
                ;;
        esac
        
        echo "远程备份完成"
    fi
}

# 主流程
echo "===== 开始备份 ($DATE) ====="
backup_mysql
backup_web
cleanup_old_backups
remote_backup
echo "===== 备份完成 ====="
